C++中的引用类型(如int\&)以两种重要的方式与值类别交互。第一个是引用可能会限制，可以绑定到的表达式的值类别。int\&类型的非const左值引用，只能用int类型的左值表达式初始化。类似地，int类型的右值引用，只能用int类型的右值表达式初始化。

值类别与引用交互的第二种方式是与函数的返回类型交互，其中使用引用类型作为返回类型会影响对该函数调用的值类别。特别是:

\begin{itemize}
\item 
对返回类型为左值引用的函数，将生成左值。

\item 
若函数的返回类型，是对象类型的右值引用，调用该函数会产生xvalue(对函数类型的右值引用会产生左值)。

\item 
调用返回非引用类型的函数会产生prvalue。
\end{itemize}

下面的示例中，将演示引用类型和值类别之间的交互。

\begin{lstlisting}[style=styleCXX]
int& lvalue();
int&& xvalue();
int prvalue();
\end{lstlisting}

给定表达式的值类别和类型可以通过decltype来确定。如第15.10.2节所述，使用引用类型来描述表达式何时为左值或xvalue:

\begin{lstlisting}[style=styleCXX]
std::is_same_v<decltype(lvalue()), int&> // yields true because result is lvalue
std::is_same_v<decltype(xvalue()), int&&> // yields true because result is xvalue
std::is_same_v<decltype(prvalue()), int> // yields true because result is prvalue
\end{lstlisting}

因此，可以进行以下的调用:

\begin{lstlisting}[style=styleCXX]
int& lref1 = lvalue(); // OK: lvalue reference can bind to an lvalue
int& lref3 = prvalue(); // ERROR: lvalue reference cannot bind to a prvalue
int& lref2 = xvalue(); // ERROR: lvalue reference cannot bind to an xvalue

int&& rref1 = lvalue(); // ERROR: rvalue reference cannot bind to an lvalue
int&& rref2 = prvalue(); // OK: rvalue reference can bind to a prvalue
int&& rref3 = xvalue(); // OK: rvalue reference can bind to an xrvalue
\end{lstlisting}
















